"""
@Time : 2023/12/27 10:13
@Auth : Mr.Zhao
#Function : 读取excel为三维列表，处理后交给测试类运行
"""
import os

import pytest
import datetime
from common.all_path import path
from common.excel import Reader
from common.excel import Writer
from Options.web_keys import MyWeb
from Options.app_keys import App
from Options.inter_keys import Inter

class DDT:
    """数据驱动类"""

    def __init__(self):
        self.obj = MyWeb()
        self.writer: Writer = Writer()
        self.reader: Reader = Reader()

        self.test_suit = []  # 二维列表，测试用例（包含多个测试步骤）
        self.test_suits = []  # 三维列表，测试用例集（包含多个测试用例）

        self.feature = ""  # 报告定制--feature
        self.f_ino = 0  # feature序号
        self.story = ""  # 报告定制--story
        self.s_ino = 0  # story序号
        # self.title = ""
        # self.t_ino = 0

        self.index = 0  # pytest数据驱动重命名序号
        self.type = "web"

    def __run_case(self):
        os.rename(path + f'test_project\\test_{self.type}_{self.index}.py', path + f'test_project\\test_{self.type}_{self.index + 1}.py')
        pytest.main(['-s', path + f'test_project\\test_{self.type}_{self.index + 1}.py', '--alluredir', './lib\\result'])
        self.index += 1

    def run_web_cases(self, name:str = '电商项目用例.xlsx'):
        case_name = name
        self.reader.open_excel(path + f'lib\\{case_name}')
        self.writer.copy_open(path + f'lib\\{case_name}', path + f'lib\\result-{case_name}')

        sheets = self.reader.get_sheets()

        #邮件参数的获取--开始时间
        start_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        self.writer.set_sheet(sheets[0])
        self.writer.write(1, 3 ,start_time)

        for sheet in sheets:
            self.reader.set_sheet(sheet)
            self.writer.set_sheet(sheet)

            self.feature = sheet  # 用例集的标题
            self.f_ino += 1
            self.s_ino = 0 #没个feature的story都从0开始
            # self.t_ino = 0

            lines = self.reader.readline()  # 本sheet的所有行，是一个二维列表
            # line 为每一行
            #lines = lines[1:]  # 不要第一行，是介绍信息

            for i in range(1,len(lines)):
                line = lines[i]
                if line[0]:
                    if self.test_suit:
                        self.test_suits.append(self.test_suit)  # 每次遇到test_suits,将上次用例存入用例集

                    if self.test_suits:
                        self.__run_case()  # 若用例集存在，则执行该用例集，后清空重新统计下次用例集

                    # 保存下次执行的test_suits的执行行数
                    self.writer.row = i + 1 #因为分组信息本身不用执行，所以传入用例集的起始行数为i + 1
                    print(f'起始行数为：{self.writer.row}')

                    self.story = line[0]  # 用例的标题
                    self.s_ino += 1
                    # self.t_ino = 0

                    self.test_suit = []  # 防止用例重复存储到下次用例集
                    self.test_suits = []
                elif line[1]:
                    if self.test_suit:
                        self.test_suits.append(self.test_suit)  # 每次遇到test_suit,如果已经存在用例test_suit则存入用例集test_suits
                    self.test_suit = []  # 清空用例重新存储下一个用例
                    self.test_suit.append(line)  # 把本用例的title当做每个test_suit的首行填入
                else:
                    self.test_suit.append(line)

            # 每次遍历完一个sheet，将最后的用例test_suit(如果存在)添加到用例集test_suits
            if self.test_suit:
                self.test_suits.append(self.test_suit)
            if self.test_suits:
                self.__run_case()
            self.test_suit = []  # 清空防止将本用例添加到下个sheet的用例集中
            self.test_suits = []

        #邮件参数的获取--结束时间
        end_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        self.writer.set_sheet(sheets[0])
        self.writer.write(1, 4, end_time)

        self.writer.save_close() #保存写入
        os.rename(path + f'test_project\\test_{self.type}_{self.index}.py', path + f'test_project\\test_{self.type}_0.py')  # 跑完了改回来名字

    def run_app_cases(self, name:str = 'qq登录用例'):
        case_name = name
        self.type = "app"
        self.obj = App()

        self.reader.open_excel(path + f'lib\\{case_name}')
        self.writer.copy_open(path + f'lib\\{case_name}', path + f'lib\\result-{case_name}')

        sheets = self.reader.get_sheets()

        # 邮件参数的获取--开始时间
        start_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        self.writer.set_sheet(sheets[0])
        self.writer.write(1, 3, start_time)

        for sheet in sheets:
            self.reader.set_sheet(sheet)
            self.writer.set_sheet(sheet)

            self.feature = sheet  # 用例集的标题
            self.f_ino += 1
            self.s_ino = 0  # 没个feature的story都从0开始
            # self.t_ino = 0

            lines = self.reader.readline()  # 本sheet的所有行，是一个二维列表
            # line 为每一行
            # lines = lines[1:]  # 不要第一行，是介绍信息

            for i in range(1, len(lines)):
                line = lines[i]
                if line[0]:
                    if self.test_suit:
                        self.test_suits.append(self.test_suit)  # 每次遇到test_suits,将上次用例存入用例集

                    if self.test_suits:
                        self.__run_case()  # 若用例集存在，则执行该用例集，后清空重新统计下次用例集

                    # 保存下次执行的test_suits的执行行数
                    self.writer.row = i + 1  # 因为分组信息本身不用执行，所以传入用例集的起始行数为i + 1
                    print(f'起始行数为：{self.writer.row}')

                    self.story = line[0]  # 用例的标题
                    self.s_ino += 1
                    # self.t_ino = 0

                    self.test_suit = []  # 防止用例重复存储到下次用例集
                    self.test_suits = []
                elif line[1]:
                    if self.test_suit:
                        self.test_suits.append(self.test_suit)  # 每次遇到test_suit,如果已经存在用例test_suit则存入用例集test_suits
                    self.test_suit = []  # 清空用例重新存储下一个用例
                    self.test_suit.append(line)  # 把本用例的title当做每个test_suit的首行填入
                else:
                    self.test_suit.append(line)

            # 每次遍历完一个sheet，将最后的用例test_suit(如果存在)添加到用例集test_suits
            if self.test_suit:
                self.test_suits.append(self.test_suit)
            if self.test_suits:
                self.__run_case()
            self.test_suit = []  # 清空防止将本用例添加到下个sheet的用例集中
            self.test_suits = []

        # 邮件参数的获取--结束时间
        end_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        self.writer.set_sheet(sheets[0])
        self.writer.write(1, 4, end_time)

        self.writer.save_close()  # 保存写入
        os.rename(path + f'test_project\\test_{self.type}_{self.index}.py', path + f'test_project\\test_{self.type}_0.py')  # 跑完了改回来名字

    def run_inter_cases(self, name:str = 'HTTP接口用例.xlsx'):
        case_name = name
        self.obj = Inter()
        self.type = "inter"

        self.reader.open_excel(path + f'lib\\{case_name}')
        self.writer.copy_open(path + f'lib\\{case_name}', path + f'lib\\result-{case_name}')

        sheets = self.reader.get_sheets()

        # 邮件参数的获取--开始时间
        start_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        self.writer.set_sheet(sheets[0])
        self.writer.write(1, 3, start_time)

        for sheet in sheets:
            self.reader.set_sheet(sheet)
            self.writer.set_sheet(sheet)

            self.feature = sheet  # 用例集的标题
            self.f_ino += 1
            self.s_ino = 0  # 没个feature的story都从0开始
            # self.t_ino = 0

            lines = self.reader.readline()  # 本sheet的所有行，是一个二维列表
            # line 为每一行
            # lines = lines[1:]  # 不要第一行，是介绍信息

            for i in range(1, len(lines)):
                line = lines[i]
                if line[0]:
                    if self.test_suit:
                        self.test_suits.append(self.test_suit)  # 每次遇到test_suits,将上次用例存入用例集

                    if self.test_suits:
                        self.__run_case()  # 若用例集存在，则执行该用例集，后清空重新统计下次用例集

                    # 保存下次执行的test_suits的执行行数
                    self.writer.row = i + 1  # 因为分组信息本身不用执行，所以传入用例集的起始行数为i + 1
                    print(f'起始行数为：{self.writer.row}')

                    self.story = line[0]  # 用例的标题
                    self.s_ino += 1
                    # self.t_ino = 0

                    self.test_suit = []  # 防止用例重复存储到下次用例集
                    self.test_suits = []
                elif line[1]:
                    if self.test_suit:
                        self.test_suits.append(self.test_suit)  # 每次遇到test_suit,如果已经存在用例test_suit则存入用例集test_suits
                    self.test_suit = []  # 清空用例重新存储下一个用例
                    self.test_suit.append(line)  # 把本用例的title当做每个test_suit的首行填入
                else:
                    self.test_suit.append(line)

            # 每次遍历完一个sheet，将最后的用例test_suit(如果存在)添加到用例集test_suits
            if self.test_suit:
                self.test_suits.append(self.test_suit)
            if self.test_suits:
                self.__run_case()
            self.test_suit = []  # 清空防止将本用例添加到下个sheet的用例集中
            self.test_suits = []

        # 邮件参数的获取--结束时间
        end_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        self.writer.set_sheet(sheets[0])
        self.writer.write(1, 4, end_time)

        self.writer.save_close()  # 保存写入
        os.rename(path + f'test_project\\test_{self.type}_{self.index}.py', path + f'test_project\\test_{self.type}_0.py')  # 跑完了改回来名字


ddt = DDT()
